.TITLE DRMKT .IDENT /08.01/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 5-SEP-73 ; ; PREVIOUSLY MODIFIED BY: ; ; B. S. MCCARTHY ; J. W. BERZLE ; C. B. PETROVIC ; J. R. KAUFFMAN ; ; MODIFIED BY: ; ; Eric Postpischil 22-JAN-90 08.01 ; edp081 -- Copy context block so that tasks in clock queue ; have separate UICs. ; ; ; MARK TIME AND RUN DIRECTIVES ; ; MACRO LIBRARY CALLS ; .MCALL CLKDF$ .IF DF N$$DIR .MCALL LNMDF$ LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETS .ENDC ;DF N$$DIR CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETS ;+ ; **-$DRMKT-MARK TIME ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DECLARE A SIGNIFICANT EVENT AT A ; SPECIFIED INTERVAL FROM INSSUANCE. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(23.),DPB SIZE(5.). ; WD. 01 -- EVENT FLAG NUMBER OF EVENT FLAG TO BE SET. ; WD. 02 -- TIME INTERVAL MAGNITUDE. ; WD. 03 -- TIME INTERVAL UNITS. ; WD. 04 -- AST ENTRY POINT ADDRESS. ; ; IF AN EVENT FLAG IS SPECIFIED, THEN IT IS CLEARED AT ISSUANCE AND ; SET AT THE TIME OF THE SIGNIFICANT EVENT. ; ; IF AN AST ENTRY POINT IS SPECIFIED, THEN AN ASYNCHRONOUS TRAP ; WILL OCCUR AT THE TIME OF THE SIGNIFICANT EVENT. PS, PC, THE ; DIRECTIVE STATUS WORD, AND THE SPECIFIED EVENT FLAG NUMBER ; ARE PUSHED ONTO THE TASK STACK WHEN THE AST IS EFFECTED. ; ; INPUTS: ; ; R0=EVENT FLAG MASK WORD. ; R1=EVENT FLAG MASK ADDRESS. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE THIRD WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT ; CORE IS AVAILABLE TO ALLOCATE CLOCK QUEUE ENTRY. ;- .ENABL LSB $DRMKT::MOV -2(R3),-(SP) ;SAVE EVENT FLAG NUMBER MOV R1,-(SP) ;SAVE EVENT FLAG MASK ADDRESS BIC #1,R1 ;CLR GRP GLOBAL EFN 2ND WORD INDICATOR BIC R0,(R1) ;CLEAR EVENT FLAG MOV R0,R4 ;SAVE EVENT FLAG MASK CALL $CVRTM ;CONVERT TIME TO CLOCK TICKS MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIME MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME MOV R4,-(SP) ;SAVE EVENT FLAG MASK CLR R4 ;SET TYPE OF CLOCK QUEUE ENTRY .IF DF S$$LIB MOV (R3),R2 ;GET AST ENTRY POINT ADDRESS CALL $CALTA ;CALCULATE PROPER ADDRESS TO STORE MOV R2,-(SP) ;SAVE AST ENTRY POINT ADDRESS .IFF MOV (R3),-(SP) ;SAVE AST ENTRY POINT ADDRESS .ENDC .IF DF A$$CNT CALL $ALCLK ;ALLOCATE A CLOCK QUEUE CONTROL BLOCK BR 25$ ; .IFF BR 20$ ; .ENDC ;+ ; **-$DRRUN-RUN TASK ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO GENERATE A CLOCK QUEUE ENTRY ; TO CAUSE A TASK TO BE REQUESTED AT A SPECIFIED DELTA TIME FROM ; ISSUANCE AND TO OPTIONALLY REPEAT THE REQUEST PERIODICALLY. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(17.),DPB SIZE (11.). ; WD. 01 -- FIRST HALF OF TASK NAME. ; WD. 02 -- SECOND HALF OF TASK NAME. ; WD. 03 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT. ; WD. 04 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT. ; WD. 05 -- REQUEST PRIORITY-NOT SUPPORTED BUT MUST BE PRESENT. ; WD. 06 -- REQUEST UIC. ; WD. 07 -- DELTA TIME MAGNITUDE. ; WD. 10 -- DELTA TIME UNITS. ; WD. 11 -- RESCHEDULE INTERVAL MAGNITUDE. ; WD. 12 -- RESCHEDULE INTERVAL UNITS. ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE OF THE TASK TO BE RUN. ; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE RUN. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE PARTITION NAME IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT ; CORE IS AVAILABLE TO ALLOCATE CLOCK QUEUE ENTRY. ; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF AN ATTEMPT IS ; MADE TO ACTIVATE A TASK WHOSE NAME BEGINS WITH ; "..." (IF EXECUTIVE-LEVEL DISPATCHING). ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A NONPRI- ; VILEGED TASK SPECIFIES ANOTHER UIC (IF MULTI- ; USER PROTECTION). ; ;- MAP5=120000 MAP6=140000 $DRRUN:: ; .IF DF R$$DSP CMP T.NAM(R0),#^R... ;MULTI-USER TASK NAME SPECIFIED? BEQ 40$ ;IF EQ YES, ILLEGAL .ENDC MOV R0,R5 ;SAVE TCB ADDRESS OF TASK TO RUN ADD #6,R3 ;POINT TO REQUEST UIC IN DPB CLR -(SP) ;SET DUMMY EFN NUMBER .IF DF M$$MUP MOV (R3)+,R1 ;PICK UP SPECIFIED UIC MOV R3,-(SP) ;SAVE R3 CALL $UISET ;ESTABLISH DEFAULT AND CURRENT UIC'S MOV (SP)+,R3 ;RESTORE R3 BCS 30$ ;IF CS NONPRV TASK SPECIFIED DIFF UIC MOV R1,-(SP) ;SAVE CURRENT UIC .IFF MOV (R3)+,-(SP) ;SAVE SPECIFIED UIC .ENDC CALL $CVRTM ;CONVERT DELTA TIME TO CLOCK TICKS MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIME MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME MOV #C.SSHT,R4 ;ASSUME SINGLE SHOT REQUEST MOV (R3)+,R0 ;ANY RESCHEDULE INTERNAL SPECIFIED? BEQ 10$ ;IF EQ NO CMP -(R3),-(R4) ;ADJUST DPB ADDRESS AND ENTRY TYPE CALL $CVRTM ;CONVERT RESCHEDULE INTERNAL TO CLOCK TICKS 10$: MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIME MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME 20$: CALL $ALCLK ;ALLOCATE A CLOCK QUEUE CONTROL BLOCK .IF DF A$$CNT MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING MOV $TKTCB,R1 ;LOCATE CURRENT TASK'S TCB MOV T.ACN(R1),KISAR6 ;MAP ACCOUNTING BLOCK BEQ 24$ ;IF EQ, NO ACCOUNTING BLOCK 22$: CMPB #BT.UAB,@#B.TYP+140000 ;IS IT A UAB BEQ 23$ ;IF EQ YES MOV @#B.PNT+140000,KISAR6 ;MAP NEXT ACCOUNTING BLOCK BR 22$ ; 23$: INCB @#B.USE+140000 ;INCREMENT USE COUNT 24$: MOV KISAR6,C.UAB(R0) ;PUT UAB ADDRESS IN CLQ BLOCK MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING 25$: ;MERGE POINT .ENDC MOV (SP)+,C.RSI(R0) ;INSERT AST ADDRESS/LOW PART OF RSI MOV (SP)+,C.RSI+2(R0) ;INSERT EFN MASK/HIGH PART OF RSI MOV (SP)+,R2 ;RETRIEVE DELTA TIME TICKS COUNT MOV (SP)+,R1 ; .IF NDF N$$DIR MOV (SP)+,C.UIC(R0) ;INSERT UIC .IFF ;NDF N$$DIR TST R4 ;IS THIS MARKTIME DIRECTIVE BNE 26$ ;IF NE, NO MOV (SP)+,C.UIC(R0) ;INSERT EFN MASK ADDRESS BR 29$ ;BR AROUND 26$: MOV (SP)+,R3 ;GET UIC OFF STACK MOV R1,-(SP) ;SAVE R1 MOV KISAR6,-(SP) ; SAVE APR 6 MAPPING. MOV R4,-(SP) ; SAVE REGISTERS. MOV R3,-(SP) ; MOV R2,-(SP) ; MOV R0,-(SP) ; CLR R0 ; ASSUME NO CONTEXT BLOCK. MOV $TKTCB,R1 ;GET TI: UCB MOV T.CTX(R1),R1 ;GET CONTEXT BLOCK BEQ 27$ ; THERE IS NONE, CREATE A DUMMY BLOCK. MOV R1,KISAR6 ; MAP THE CONTEXT BLOCK. MOVB C.DDSL+MAP6,R0 ; GET THE LENGTH OF THE DIRECTORY STRING. MOV #C.DDS+MAP5,R2 ; POINT TO DIRECTORY STRING WITH PAGE 5 ADDRESS. 27$: CALL $CRCTX ;CREATE CONTEXT BLOCK BCS 50$ ;IF CS, ALLOCATION FAILURE MOV R3,R1 ; MOVE BIAS OF CONTEXT BLOCK. MOV (SP)+,R0 ; RESTORE REGISTERS. MOV (SP)+,R2 ; MOV (SP)+,R3 ; MOV (SP)+,R4 ; MOV R1,C.CTX(R0) ; INSERT CONTEXT BLOCK ADDRESS IN CLOCK BLOCK. MOV R1,KISAR6 ; MAP THE NEW CONTEXT BLOCK. MOVB #1,C.REF+MAP6 ; MAKE NOTE OF OUR NEW REFERENCE TO IT. MOV R3,C.CUIC+MAP6 ; STORE THE UIC, THE WHOLE REASON FOR THIS COPY. MOV (SP)+,KISAR6 ; RESTORE PREVIOUS MAPPING. MOV (SP)+,R1 ;RESTORE R1 BIS #100000,R4 ;INDICATE SCHEDULE REQUEST WITH DDS 29$: .ENDC ;DF N$$DIR MOVB (SP)+,C.EFN(R0) ;INSERT EFN/ZERO BYTE CALLR $CLINS ;INSERT IN CLOCK QUEUE .IF DF M$$MUP 30$: DRSTS D.RS16 ;PRIVILEGE VIOLATION .ENDC .IF DF R$$DSP 40$: DRSTS D.RS7 ;MULTI-USER TASK NAME SPECIFIED .ENDC .IF DF N$$DIR 50$: DRSTS D.RS1 ;ALLOCATION FAILURE .ENDC ;DF N$$DIR .DSABL LSB .END